/**
 * 
 */
package sources;

import java.util.ArrayList;
import java.util.List;

import constrain.Constraint;

/**
 * @author Kyniek
 *
 */
public class SimpleSource implements ISource
{
	
	protected List<Object> data;
	
	private String name;
	
	private String type;
	
	enum Order {NATURAL, RANDOM };
	
	private Order order = Order.NATURAL;
	
	private List<Constraint> con = new ArrayList<Constraint>();
	
	private String id;
	
	private int current = 0;

	
	
	/**
	 * Podstawowa wersja konstruktora, elementy z tego źródła są zwracane w kolejności NATURAL - kolejność identyczna jak w liście 
	 * @param ls lista gotowych obiektów
	 * @param nam nazwa źródła
	 * @param typ typ źródła - dla bazy danych
	 */
	public SimpleSource(List<Object> ls, String nam, String typ)
	{
		this(ls, nam, typ, Order.NATURAL);
	}
	
	
	/**
	 * Tworzony obiekt źródła prostego, przyjmującego listę wartości oraz zwracającego elementy w naturalnej kolejności lub losowej
	 * @param ls lista elementów
	 * @param nam nazwa źródła, równocześnie nazwa kolumny w bazie danych
	 * @param typ określa typ danych w bazie
	 * @param ord określa kolejność zwracania elementów przez źródło : NATURAL lub RANDOM
	 */
	public SimpleSource(List<Object> ls, String nam, String typ, Order ord)
	{
		data = ls;
		name = nam;
		type = typ;
		order = ord;
	}
	
	
	
	
	/* (non-Javadoc)
	 * @see sources.ISource#setDataType(java.lang.String)
	 */
	@Override
	public void setDataType(String typeName)
	{		
		type = typeName;
	}

	
	/* (non-Javadoc)
	 * @see sources.ISource#getDataType()
	 */
	@Override
	public String getDataType()
	{
		return type;
	}
	

	/* (non-Javadoc)
	 * @see sources.ISource#setConstraint(constrain.Constraint)
	 */
	@Override
	public void setConstraint(Constraint con)
	{
		this.con.clear();
		this.con.add(con);
	}
	

	/* (non-Javadoc)
	 * @see sources.ISource#setConstraint(java.util.List)
	 */
	@Override
	public void setConstraint(List<Constraint> con)
	{
		this.con = con;
	}
	

	/* (non-Javadoc)
	 * @see sources.ISource#getConstraint()
	 */
	@Override
	public List<Constraint> getConstraint()
	{
		return con;
	}
	

	/* (non-Javadoc)
	 * @see sources.ISource#setName(java.lang.String)
	 */
	@Override
	public void setName(String name)
	{
		this.name = name;
	}
	

	/* (non-Javadoc)
	 * @see sources.ISource#getName()
	 */
	@Override
	public String getName()
	{
		return name;
	}
	

	/* (non-Javadoc)
	 * @see sources.ISource#setUniqueName(java.lang.String)
	 */
	@Override
	public void setUniqueName(String name)
	{
		id = name;
	}

	
	/* (non-Javadoc)
	 * @see sources.ISource#getUniqueName()
	 */
	@Override
	public String getUniqueName()
	{
		return id;
	}

	/* (non-Javadoc)
	 * @see sources.ISource#get()
	 */
	@Override
	public Object get()
	{
		Object val = "";
		
		switch (order)
		{
			case RANDOM:
				val = data.get(  (int)(Math.random() * data.size() ) );
				break;
			default : 
				if(current >= data.size())
				{
					current = 0;
				}
				val = data.get(current);
				current++;
				break;
			
		}
		return val;
	}

	/* (non-Javadoc)
	 * @see sources.ISource#get(int)
	 */
	@Override
	public Object[] get(int dataSize)
	{
		Object res[] = new Object[dataSize];
		for(int i = 0; i < res.length; i++)
		{
			res[i] = get();
		}
		return res;
	}

	/* (non-Javadoc)
	 * @see sources.ISource#generateDeclaration()
	 */
	@Override
	public String generateDeclaration()
	{
		return name + " " + type;
	}

}
